#include "merchantcontroller.h"
#include "../dao/userdao.h"
#include "../dao/organizationdao.h"
#include "../dao/approveexam.h"
#include "../dao/saledao.h"
#include "../dao/orderroledao.h"
#include "../poco/user.h"
#include "../dao/windowdao.h"
#include"../dao/userdao.h"
#include <iostream>
int debug = 1;
#include <QDebug>
/*
商家具体的操作函数实现：

*/

MerchantController::MerchantController()
{

}


bool MerchantController::login(User &user)
{
    if(user.phone.length() == 0 || user.password.length()== 0)  //先简单判断是否为空
        return false;

    string passwd_old = user.password;

    UserDao db;
    bool ret = db.getUser(user);

    if(!ret)
        return false;
    if(passwd_old != user.password)  //判断用户密码输入是否正确
        return false;
    if(user.type != User::TYPE_merchant)  //判断用户类型
    {
        qDebug()<<"用户类型出错";
        return false;
    }

    this->user = user;  //存储user信息
    return true;
}

bool MerchantController::registerUser(User& user)
{
    UserDao db;
    User user_test;
    bool ret0 = db.getUser(user_test);
    if(user.phone==user_test.phone)  //存在用户则无法注册
        return false;

    /*判断用户输入的信息的合法性*/
    //电话号码的长度必须为11位
    if ( user.phone.length() != 11 ){
        if(debug)std::cout <<"电话号码的长度必须为11位!!!"<< std::endl;
        return false;
    }

    //判断电话输入是否只有数字
    //for(auto i = user.phone.begin(); i != user.phone.end(); i++)
    for(char & i : user.phone)
    if ( i < 48 || i > 57 ){
        if(debug)std::cout <<"电话只能有数字!!!"<< std::endl;
        return false;
    }

    //确定是否是商家
    if ( user.type != User::TYPE_merchant ){
        if(debug)std::cout <<"用户类型不是商家!!!"<< std::endl;
        return false;
    }


    //身份证号的长度必须为18位
    if ( user.identityCard.length() != 18 ){
        if(debug)std::cout <<"身份证号的长度必须为18位"<< std::endl;
        return false;
    }

    //判断身份证输入是否只有数字或X,x
    //for(auto i = user.identityCard.begin(); i != user.identityCard.end(); i++){
    for(char & i : user.identityCard){
        if ( i != 88 && i != 120 && (i < 48 || i > 57) ){
            if(debug)std::cout <<"身份证输入是否只有数字或X,x"<< std::endl;
            return false;
        }
        if ( i == 120 ){
            i -= 32;
        }
    }

    //确定性别输入是否正确
    if ( user.sex != "M" && user.sex != "F" && user.sex != "m" && user.sex != "f"){
        if(debug)std::cout <<"性别为M/m/F/f"<< std::endl;
        return false;
    }
    if ( user.sex == "m"){
        user.sex = "M";
    }
    if ( user.sex == "f"){
        user.sex = "F";
    }

    //判断输入是否只有数字
    //for(auto i = user.creditCard.begin(); i != user.creditCard.end(); i++){
    for(char & i : user.creditCard){
    if ( i < 48 || i > 57 ){
        if(debug)std::cout <<"银行卡号只有数字"<< std::endl;
        return false;
    }
    }


    //程序运行到此处说明各项检查均通过，可以进行注册
    bool ret = db.insertUser(user);  //开始注册
    if(!ret)
        return false;

    return true;

}

bool MerchantController::getWindows(vector<WindowInfo> &wins)
{
    WindowDao db;
    wins = db.selectUserWindow(this->user);
    return true;

}

bool MerchantController::openWindow(WindowInfo& win,WindowController& wincol)
{
    /* 打开窗口，根据已有的windowInfo 查询窗口的 所有信息，构造一个WindowController，返回回去即可
     * windowsinfo 的构造需要调用 类里面的 set函数，将各个字段置为想要的值，目标值用dao操作一个个查询出来
     * */
    if(win.status == WindowInfo::STATUS_haltSale)  //正在审批的窗口无法打开
        return false;

    WindowController db_control;
    SaleDao db_sale;
    OrderRoleDao db_order;

    //利用上述获得的Dao 查询信息 并赋值给 controller
    db_control.setWindow(win);
    db_control.setSales(db_sale.selectAllSale(win));
    db_control.setorderRoles(db_order.selectAllRole(win));
    db_control.setUser(user);


    // 操作结束，赋值并返回即可
    wincol = db_control;

    return true;
}

bool MerchantController::joinOrg(OrganizationInfo org)
{
    //先审批
    ApproveExam db;
    bool ret = db.addJionExam(this->user,org);
    // OrganizationDao db;
    // ret = db.alterOrg(org);
    if(!ret)
        return false;

    return true;

}

bool MerchantController::getAllOrg(vector<OrganizationInfo>& orgs)
{
    //  什么时候返回false ？
    OrganizationDao db;
    orgs = db.selectAll();
    return true;
}

//查询所有可以申请的窗口，调用windowDao函数
bool MerchantController::getApplyWindow(vector<WindowInfo>& wins)
{
     WindowDao wd;
     wins=wd.selectSpareWindow(user);
     return true;
}

//窗口申请，指定窗口id,调用approveExam中的addWindowExam函数插入，
//并修改windowInfo表中的状态为status
bool MerchantController::applyWindow(WindowInfo win)
{
    ApproveExam ae;
    //添加状态
    ae.addWindowExam(user,win);
    //修改windowInfo表
    WindowDao wd;
    wd.selectWindow(win);//填充信息
    win.status=WindowInfo::STATUS_haltSale;//审批状态
    return wd.alterWindow(win);
}
